/*
 * Класс создает рисунок поля игры с бекграундом, клеточками и цифрами.
 */

package sudoku;

import com.sun.imageio.plugins.common.ImageUtil;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;


/**
 *
 * @author Taras
 */
public class SudokuCanvas extends JPanel{

    // Рисунок одной плитки для фона.
    private BufferedImage backgroundImg;

    // Базовый размер поля.
    private int x = 450;
    private int y = 450;

    // Масштаб
    private double zoom = 1;

    // Обьект с расстановкой чисел на поле.
    private ClassicGrid grid = null;

    // Дефолтный конструктор поля для игры.
    public SudokuCanvas(double z){
        super();

        // Создаем дефолтный обект который определяет расстановку чисел.
        grid = new ClassicGrid();
        grid.solveFastApproach();
        grid.printGrid();
        // Вносим массштабирование.
        zoom = z;
        x = (int) (x * zoom);
        y = (int) (y * zoom);

        // Пробуем читать изображение одной плитки фона.
        try {
            backgroundImg = ImageIO.read(new File("background.jpg"));
        } catch (IOException ex) {
            System.out.println("No background image found.");
        }

        // Устанавливаем размер поля для вышестоящего лэйаута окна игры.
        setPreferredSize(new Dimension(x+2,y+2));

    }

    @Override
    public void paintComponent(Graphics g)
        {
           super.paintComponent(g);

           // Пробуем нарисовать фон.
           try {

               // Код черепичного закрашивания позаимствован :)
               // http://www.raditha.com/java/swing/tile2.php

                int x, y;
		int width, height;

		Rectangle clip = g.getClipBounds();

		width = backgroundImg.getHeight(this);
		height = backgroundImg.getWidth(this);

		if(width > 0 && height > 0)
		{
			for(x = clip.x+1; x < (clip.x + clip.width) ; x += width)
			{
				for(y = clip.y+1; y < (clip.y + clip.height) ; y += height)
				{
					g.drawImage(backgroundImg,x,y,this);					
				}
			}
		}
           } catch (Exception e){
           }

           // Рисуем таблицы клеток.
           for (int i =0; i<10; i++){
           g.drawLine(i*this.x/9, 0, i*this.x/9, this.y);
           g.drawLine(0, i*this.y/9, this.x, i*this.y/9);
           }
           for (int i =0; i<4; i++){
           g.drawLine(i*this.x/3-1, 0, i*this.x/3-1, this.y);
           g.drawLine(0, i*this.y/3-1, this.x, i*this.y/3-1);
           g.drawLine(i*this.x/3+1, 0, i*this.x/3+1, this.y);
           g.drawLine(0, i*this.y/3+1, this.x, i*this.y/3+1);
           }

           // Рисуем цифры в клетках, если они уже определены.
           if (grid != null) drawNumbers(g);
           
        }

    // Заполняем пустую табличку циферками
    private void drawNumbers(Graphics g){

        // Устанавливаем шрифт с высотой относительно зума.
        Font font = new Font(null, 0, x/15);
        g.setFont(font);

        for (int i=0; i<81; i++){

            int value = grid.getValues().get(i);
            if (value != 0){
                boolean access = grid.getAccess().get(i);
                char[] data = new char[2];
                data[0] = Character.forDigit(value, 10);
               
                if (access){
                    g.setColor(Color.GRAY);
                } else {
                    g.setColor(Color.BLACK);
                }
                g.drawChars(data, 0, 1, (i%9) * (x/9) + (x/27), (i/9) * (y/9) + (y/12));

            }
        }

    }
}
